#ifndef _CONTROL_H_
#define _CONTROL_H_

#ifdef __cplusplus
extern "C"
{
#endif

/* Files include */
#include "hal_conf.h"

// 密码
#define PASSWORD_P0_MIN 0
#define PASSWORD_P0_MAX 99

// 温度设定
#define SET_TEMP_C0_DEFAULT 3 // 2-8   摄氏度 ℃
#define SET_TEMP_C0_MAX C5    // 2-8   摄氏度 ℃
#define SET_TEMP_C0_MIN C6    // 2-8   摄氏度 ℃

// 温度上回差
#define TEMP_UP_RETURN_DIFF_C1_DEFAULT 15 // 0.1摄氏度 ℃
#define TEMP_UP_RETURN_DIFF_C1_MIN 0      // 0.1摄氏度 ℃
#define TEMP_UP_RETURN_DIFF_C1_MAX 99     // 0.1摄氏度 ℃

// 温度下回差
#define TEMP_DOWN_RETURN_DIFF_C2_DEFAULT 15 // 0.1摄氏度 ℃
#define TEMP_DOWN_RETURN_DIFF_C2_MIN 0      // 0.1摄氏度 ℃
#define TEMP_DOWN_RETURN_DIFF_C2_MAX 99     // 0.1摄氏度 ℃

// 压缩机最小停机时间
#define COMPRESSOR_OFFTIME_C3_DEFAULT 3 // 1分钟
#define COMPRESSOR_OFFTIME_C3_MIN 0     // 1分钟
#define COMPRESSOR_OFFTIME_C3_MAX 99    // 1分钟

// 压缩机首次停机时间
#define COMPRESSOR_1STOFFTIME_C4_DEFAULT 0 // 10S
#define COMPRESSOR_1STOFFTIME_C4_MIN 0     // 10S
#define COMPRESSOR_1STOFFTIME_C4_MAX 99    // 10S

// 温度设定上限
#define SET_TEMP_UP_C5_DEFAULT 8 // 摄氏度 ℃
#define SET_TEMP_UP_C5_MIN C0    // 摄氏度 ℃
#define SET_TEMP_UP_C5_MAX 55    // 摄氏度 ℃

// 温度设定下限
#define SET_TEMP_DOWN_C6_DEFAULT 8 // 摄氏度 ℃
#define SET_TEMP_DOWN_C6_MIN C0    // 摄氏度 ℃
#define SET_TEMP_DOWN_C6_MAX 55    // 摄氏度 ℃

// 温度补偿
#define TEMP_COMP_C7_DEFAULT -10 // 0.1摄氏度 ℃
#define TEMP_COMP_C7_MIN -99     // 0.1摄氏度 ℃
#define TEMP_COMP_C7_MAX 99      // 0.1摄氏度 ℃

// 传感器故障压缩机开机时间
#define SENSOR_ERR_COMPRESSOR_ON_TIME_C8_DEFAULT 10 // 1分钟
#define SENSOR_ERR_COMPRESSOR_ON_TIME_C8_MIN 0      // 1分钟
#define SENSOR_ERR_COMPRESSOR_ON_TIME_C8_MAX 99     // 1分钟

// 传感器故障压缩机停机时间
#define SENSOR_ERR_COMPRESSOR_OFF_TIME_C9_DEFAULT 10 // 1分钟
#define SENSOR_ERR_COMPRESSOR_OFF_TIME_C9_MIN 1      // 1分钟
#define SENSOR_ERR_COMPRESSOR_OFF_TIME_C9_MAX 99     // 1分钟

// 除霜周期
#define DEFROST_CYCLE_D1_DEFAULT 6 // 1小时
#define DEFROST_CYCLE_D1_MIN 0     // 1小时
#define DEFROST_CYCLE_D1_MAX 99    // 1小时

// 除霜时间
#define DEFROST_TIME_D2_DEFAULT 25 // 1分钟
#define DEFROST_TIME_D2_MIN 1      // 1分钟
#define DEFROST_TIME_D2_MAX 99     // 1分钟

// 高温报警值
#define HIGH_TEMP_ERR_A1_DEFAULT 50 // 摄氏度 ℃
#define HIGH_TEMP_ERR_A1_MIN A2     // 摄氏度 ℃
#define HIGH_TEMP_ERR_A1_MAX 50     // 摄氏度 ℃

// 低温报警值
#define LOW_TEMP_ERR_A2_DEFAULT -40 // 摄氏度 ℃
#define LOW_TEMP_ERR_A2_MIN A2      // 摄氏度 ℃
#define LOW_TEMP_ERR_A2_MAX 50      // 摄氏度 ℃

// 超温持续时间
#define ABOVE_TEMP_CONTINUE_TIME_A3_DEFAULT 1 // 1分钟
#define ABOVE_TEMP_CONTINUE_TIME_A3_MIN 0     // 1分钟
#define ABOVE_TEMP_CONTINUE_TIME_A3_MAX 99    // 1分钟

// 显示方式
#define DISPLAY_MODE_F1_1 0 // 显示方式1
#define DISPLAY_MODE_F1_2 1 // 显示方式2

// 显示模式
#define DISPLAY_MODE_F2_0 0 // 0：显示实际温度
#define DISPLAY_MODE_F2_1 1 // 1：显示修正温度
#define DISPLAY_MODE_F2_2 2 // 2：显示设定温度

// 显示时间
#define DISPLAY_TIME_F3 0 // 显示时间

#define COMPRESSOR_ON 1  // 压机开
#define COMPRESSOR_OFF 0 // 压机关

#define GET_AD_COV_TIME 20 // ms AD扫描时间

#define SENSOR_AD_MAX 0xFF0 // 121KΩ -50度 判断为短路
#define SENSOR_AD_MIN 0x0F  // 0.3543 70度 判断为断路

#define LONG_KEY_PRESS_TIME 20 // 5ms*20=100ms

#define SENSOR_ERR_DELAY_TIME 100 // 4*250ms

#define TEMP_UP_RETURN_DIFF_C1 ((signed char)(u8_TempUpReturnDiff_C1 / 10))     // 开机点上回差
#define TEMP_DOWN_RETURN_DIFF_C2 ((signed char)(u8_TempDownReturnDiff_C2 / 10)) // 关机点下回差

#define POWER_ON_TEMP (signed char)(s8_SetTemp_C0 + TEMP_UP_RETURN_DIFF_C1)    // 开机点温度
#define POWER_OFF_TEMP (signed char)(s8_SetTemp_C0 - TEMP_DOWN_RETURN_DIFF_C2) // 关机点温度

    extern uint8_t u8_Password_P0;
    extern signed char s8_SetTemp_C0;
    extern uint8_t u8_TempUpReturnDiff_C1;
    extern uint8_t u8_TempDownReturnDiff_C2;
    extern uint8_t u8_CompressorOffTime_C3;
    extern uint8_t u8_Compressor1stOffTime_C4;
    extern signed char s8_SetTempUp_C5;
    extern signed char s8_SetTempDown_C6;
    extern signed char s8_TempComp_C7;
    extern uint8_t u8_SensorErrCompressorOnTime_C8;
    extern uint8_t u8_SensorErrCompressorOffTime_C9;
    extern uint8_t u8_DefrostCycle_D1;
    extern uint8_t u8_DefrostTime_D2;
    extern signed char s8_HighTempErr_A1;
    extern signed char s8_LowTempErr_A2;
    extern uint8_t u8_AboveTempContinueTime_A3;
    extern uint8_t u8_DisplayMode_F1;
    extern uint8_t u8_DisplayMode_F2;
    extern uint8_t u8_DisplayTime_F3;

    extern signed char s8_SetTempC0Display;
    extern uint8_t u8_CompressorState; // 压机状态
    extern uint16_t u16_RealTemp;
    extern uint8_t u8_Compressor1stOnTimeFlag; // 第一次上电开机时间
    extern uint8_t u8_CompressorOffTimeFlag;   // 最小关机时间标志
    extern uint8_t u8_DefrostState;            // 除霜模式
    extern uint8_t u8_OpenCompressorTempFlag;  // 开机点标志
    extern uint8_t u8_CloseCompressorTempFlag; // 关机点标志
    extern uint8_t u8_HighTempErrFlag;         // 高温报警标志
    extern uint8_t u8_LowTempErrFlag;          // 低温报警标志
    extern uint8_t u8_HighTempErrFlag;         // 高温报警标志
    extern uint8_t u8_LowTempErrFlag;          // 低温报警标志
    // extern uint8_t u8_AboveTempContinueTimeFlag; // 超温到时间标志
    extern uint8_t u8_SensorErrFlag;      // 传感器故障标志
    extern uint8_t u8_SensorErrDelayTime; // 传感器故障报警缓冲时间
    extern uint8_t u8_SensorErrCompOnOff; // 传感器故障压机开/关
    extern uint16_t u16_SetTemp2AD_C0;    // 设定的温度数字转成AD值
    extern uint16_t u16_500msDelay;       // 2HZ按键快速加功能
    extern uint8_t u8_MenuTimeOutExeFlag; // 菜单显示时间到后处理流程
    extern uint8_t u8_PowerOn;            // 第一次上电
    extern uint8_t u8_Time1SState;        // 1S时基刷新
    extern uint8_t u8_Time500msState;     // 500时基刷新 1HZ
    extern uint8_t u8_Time250msState;     // 250时基刷新 0.5HZ
    extern uint32_t u32_GetADTimer;       // 获取AD值扫描时间

    extern uint8_t u8_TempIsSet;  // 无按键执行再查表温度设置值
    extern uint8_t u8_GetSetTemp; // 执行查找设定温度值

#define OPEN_COMPRESSOR_TEMP u8_SetTemp_C0 + u8_TempUpReturnDiff_C1
#define CLOSE_COMPRESSOR_TEMP u8_SetTemp_C0 + u8_TempDownReturnDiff_C2

#define DEFROST_STATE_OFF 0
#define DEFROST_STATE_ON 1
    // #define DEFROST_STATE_DURATION 2

    extern void CompressorControl(void);

    extern uint8_t read_button_GPIO(uint8_t button_id);
    extern void Key_Scan(void);
    extern void Key_Configure(void);
    extern void BTN1_SINGLE_Click_Handler(void *btn);
    extern void BTN1_LONG_PRESS_START_Handler(void *btn);
    extern void BTN1_LONG_PRESS_HOLD_Handler(void *btn);
    // extern void BTN1_PRESS_REPEAT_Handler(void *btn);
    extern void BTN1_PRESS_UP_Handler(void *btn);
    extern void TimeBaseFunRefresh(void);
    extern void GetSetTemp2AD(void);
    extern void GetSystemState(void);
#ifdef __cplusplus
}
#endif

#endif /* _CONTROL_H_ */
